#include <stdio.h>
#include <stdlib.h>
#include <time.h>


// 包含线程池实现（只在一个源文件中定义）
#define THREAD_POOL_IMPLEMENTATION
#include "tpool.hol.h"

// 定义async库实现（只在一个源文件中定义）
#define ASYNC_IMPLEMENTATION
#include "async.hol.h"

// 示例1: 异步计算数字平方
void* square_task(void* args) {
    int num = *(int*)args;
    int* result = (int*)malloc(sizeof(int));
    *result = num * num;
    
#ifdef _WIN32
    printf("线程 %lu: 计算 %d 的平方\n", GetCurrentThreadId(), num);
    Sleep(1000); // 模拟计算耗时
#else
    printf("线程 %lu: 计算 %d 的平方\n", pthread_self(), num);
    sleep(1); // 模拟计算耗时
#endif
    
    free(args); // 释放输入参数
    return result;
}

// 示例2: 异步计算求和
void* sum_task(void* args) {
    int* nums = (int*)args;
    int* result = (int*)malloc(sizeof(int));
    *result = nums[0] + nums[1];
    
#ifdef _WIN32
    printf("线程 %lu: 计算 %d + %d\n", GetCurrentThreadId(), nums[0], nums[1]);
    Sleep(1500); // 模拟计算耗时
#else
    printf("线程 %lu: 计算 %d + %d\n", pthread_self(), nums[0], nums[1]);
    sleep(1); // 模拟计算耗时
#endif
    
    free(args); // 释放输入参数
    return result;
}

int main() {
    // 初始化异步框架
    printf("初始化异步框架...\n");
    async_init();
    
    // 示例1: 提交单个异步任务并等待结果
    printf("\n=== 单个异步任务示例 ===\n");
    int* num = (int*)malloc(sizeof(int));
    *num = 7;
    async_result_t* square_result = async(square_task, num);
    
    printf("主线程继续执行...\n");
    
    // 等待异步任务完成并获取结果
    int* square_val = (int*)await(square_result);
    printf("7 的平方是: %d\n", *square_val);
    free(square_val);
    
    // 示例2: 提交多个异步任务
    printf("\n=== 多个异步任务示例 ===\n");
    int* nums1 = (int*)malloc(2 * sizeof(int));
    nums1[0] = 10;
    nums1[1] = 20;
    async_result_t* sum_result1 = async(sum_task, nums1);
    
    int* nums2 = (int*)malloc(2 * sizeof(int));
    nums2[0] = 30;
    nums2[1] = 40;
    async_result_t* sum_result2 = async(sum_task, nums2);
    
    printf("主线程继续执行其他操作...\n");
    
    // 等待所有任务完成
    int* sum_val1 = (int*)await(sum_result1);
    int* sum_val2 = (int*)await(sum_result2);
    
    printf("10 + 20 = %d\n", *sum_val1);
    printf("30 + 40 = %d\n", *sum_val2);
    
    // 释放结果内存
    free(sum_val1);
    free(sum_val2);
    
    // 清理资源
    printf("\n清理异步框架资源...\n");
    async_cleanup();
    
    return 0;
}
